/*
 * Copyright (c) 2021. Moses All Right Reserved
 */

package com.moses.design_patterns.proxy.dynamic_proxy.cglib;


/**
 * @author Moses
 * @email shenhuohui@gmail.com
 * @date 2021/4/11 17:41
 */
public class Client {
    public static void main(String[] args) {
        // cglib 动态代理的核心是
        // 1. 实现 MethodInterceptor 接口并重写 intercept，作为方法的增强
        // 2. 实例 Enhancer，并设置父类及回调

        // cglib 增强对未实现接口的类
        Subject subject = new Subject();
        Subject proxy = (Subject) CGLibDynamicProxy.getProxy(subject);
        proxy.method();

        // cglib 对实现了接口的类也可以增强
        ISubject proxy2 = (ISubject) CGLibDynamicProxy.getProxy(new RealSubject());
        proxy2.method();

        // 也就是说，cglib动态代理可以做到的，jdk动态代理不一定能做到
        // jdk动态代理能做到的，cglib动态代理也可以做到
    }
}
